/**
 * 工具中间件,如上传文件等操作
 * @type {module:fs}
 */
const fs = require('fs'),
  util = require("util");
var path = require("path");

module.exports = {
  /**
   * 上传文件<上传图片中间件>
   * @param request
   * @param response
   * @param next
   */
  uploadFile: (request, response, next) => {
    // 接收上传成功的文件对象
    let {imgBase, date_name} = request.body;
    console.log('检查是否存在上传...');

    if (request.tokenData && imgBase) { // 入存在此token信息且存在上传文件
      let username = request.tokenData.username;   //用来创建用户目录的变量
      // const date = utils.formatDate(new Date(), 'yyyy0MM0dd0hh0mm0ss');
      // console.log('String date=' + date);
      // console.log('String date type=' + typeof date);

      let filename = username + '0' + date_name; // 这此重命名的文件路径是用解析token所得的username + 0 +前台发来的date_name组成的,与存入的数据库的src文件名相同,但是路径不同<此路径在项目的根下,因此,用户还无法访问,还需要对此文件进行重命名至static开放的目录下,并保证与数据库的路径名一致,使用户能够访问>

      console.log('上传者:' + username + ';文件名:' + filename + ';');

      //过滤data:URL
      let base64Data = imgBase.replace(/^data:image\/\w+;base64,/, "");
      // 返回一个被 string 的值初始化的新的 Buffer 实例,原始二进制数据存储在 Buffer 类的实例中,一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
      let base64DataBuffer = Buffer.from(base64Data, 'base64');
      // 写入文件
      let oldFile = filename + '.png';
      fs.writeFile(oldFile, base64DataBuffer, function (error) {
        if (error) {
          console.log('写入文件失败');
        } else {
          console.log('写入文件成功');
        }
      });

      console.log('重命名文件至指定目录.......');
      let newFilePath = '/upload/user/' + username + '/' + filename + '.png'; // 此路径和文件名与存入数据库的一致,用户可以通过此路径访问到相应的资源

      let pwd = path.resolve('./'); // 获取当前的文件路径

      /**重命名文件至指定目录*/
      fs.mkdir(pwd + '/static/upload/user/' + username + '/', function () { // 创建用户目录，如果该目录存在，是不会对原目录覆盖的
        console.log('用户目录《' + username + '》准备就绪')
      })
      // let extname = path.extname(filename.originalname);//此方法是获取文件的后缀名    file.originalname ==> 文件的原名称
      // 此方法对上传文件路径做更改(文件上传至本项目的目录下,与static平级,没有在static开放目录下所以要进行重命名)   参数1，旧路径；参数2，新路径   file.path ==> 上传后的文件路径
      // fs.renameSync(pwd + "/" + oldFile , pwd + '/static' + newFilePath); // 参数1、相对于本项目下的一级路径,即其文件名就是其路径;参数2、更改成的新路径,即更改为相对于本项目的static目录下的对应目录,否则,其他目录未开放,用户是不能访问的。

      let readStream = fs.createReadStream(pwd + "/" + oldFile);
      let writeStream = fs.createWriteStream(pwd + '/static/upload/user/' + username + '/' + oldFile);
      readStream.pipe(writeStream);
      readStream.on('end',function(){
        fs.unlinkSync(pwd + "/" + oldFile);
      });

      console.log('重写成功' + newFilePath);

    } else {
      console.log('无上传');
    }

    next();
  }
}
